/*
 * TDA_DNS.h
 *
 *  Created on: Nov 21, 2013
 *      Author: enano
 */

#ifndef TDA_DNS_H_
#define TDA_DNS_H_

#include <stdio.h>
#include "Lista.h"
#include "ABO.h"

#define OK 0
#define ERROR -1
#define DOM_INEXISTENTE -2
#define DOM_VACIO -3

 #define IPv4 16     /* x.x.x.x ( 0 <= x <= 255) + '\0' */

//typedef char* IPv4;

typedef struct _TDADNS
{
    size_t tamanio;
    TListaSimple dominios;
}TDADNS;


typedef struct
{
    char *dominio;
    void* data;
    TABO subarbol;
}elemArbol;


typedef struct
{
    char* dominio;
    void* data;
}elemInter;

typedef void (*dnsDestroy) ( void* );

//typedef enum { DNS_Crear, DNS_Usar } modoParseo;



/**
 * Crea una instancia del TDA DNS.
 *
 * PRE-CONDICION: dns tiene sizeof(TDADNS) bytes reservados. dns No creado.
 * POST: se inicializó la estructura apuntada por dns.
 *
 * @param: manipulador del TDA, type: TDADNS*.
 * @param: tamaño del tipo de dato T que tendran los elementos que se van a guardar asociados a un dominio, type: siez_t.
 * @return: OK si tod0 salió bien.
 *          ERROR en caso contrario.
 *
 */
int crearDNS( TDADNS* dns, size_t tamDato );


/**
 * Destruye la instancia del TDA DNS.
 *
 * PRE-CONDICION: dns creado y vacio.
 * POST: se destruyó la instancia dns.
 *
 * @param: manipulador del TDA, type: TDADNS*.
 *
 */
void destruirDNS ( TDADNS* dns );


/**
 * Agrega un dominio con un dato asociado.
 *
 * PRE-CONDICION: dns creado, dominio es un nombre de dominio valido y no existente en dns. dato apunta a una variable de tipo T.
 * POST: se agregó el dominio 'dominio' y se asoció el valor dato.
 *
 * @param: manipulador del TDA, type: TDADNS*.
 * @param: nombre de dominio a agregar, type: char*.
 * @param: dato a agregar, type: void*.
 * @return: OK si tod0 salió bien.
 *          ERROR en caso contrario.
 *
 */
int agregarDominio( TDADNS* dns, char* dominio, void* dato );


/**
 * Obtiene el valor asociado a un dominio.
 * PRE-CONDICION: dns creado, dominio es un nombre de dominio valido existente en dns, dato apunta a una variable del tipo T.
 * POST: se copió a dato el valor asociado al dominio 'dominio'.
 *
 * @param: manipulador del TDA, type: TDADNS.
 * @param: nombre del dominio a obtener, type: char*.
 * @param: dato obtenido, type: void*.
 */
void obtenerValor( TDADNS dns, char* dominio, void* dato );


/**
 * Devuelve TRUE si dominio existe en dns. En cualquier otro caso devuelve FALSE.
 * PRE-CONDICION: dns creado, dominio es un nombre de 'dominio' valido.
 * POST: no realiza modificaciones.
 *
 * @param: manipulador del TDA, type: TDADNS;
 * @param: nombre de dominio a consultar, type: char*.
 * @return: TRUE, si existe dominio en dns.
 *          FALSE, en cualquier otro caso.
 *
 */
int existeDominio( TDADNS dns, char* dominio );


/**
 * Elimina un dominio.
 * PRE-CONDICION: dns creado, dominio es un nombre de dominio valido y existente en dns.
 * POST: se eliminó dominio, y su valor asociado de dns.
 *
 * @param: manipulador del TDA, type: TDADNS*.
 * @param: nombre de dominio a eliminar, type: char*.
 */
void eliminarDominio( TDADNS* dns, char* dominio );


/**
 * Devuelve una lista con todos los subdominios bajo el dominio recibido por parametros
 * PRE-CONDICION: dns creado y ListaSimple creada.
 * POST: se escribió en la lista, todos los subdominios de 'dominio'.
 *
 * @param: manipulador del TDA, type: TDADNS.
 * @param: nombre de dominio a obtener lista, type: char*.
 * @param: lista donde se devolverán los datos, type: TListaSimple*.
 * @return: OK, si tod0 salió bien.
 *          ERROR, en caso contrario.
 */
int obtenerLista( TDADNS dns, char* dominio, TListaSimple* ls);




#endif /* TDA_DNS_H_ */
